昨天簡單的介紹甚麼是閉包後,可以知道閉包的特點有
這兩點可以使有閉包的函式作出一般函式作不到的事情,下面來實作看看
全域變數因為大家都能存取的關係,很容易被修改,
區域變數在函式結束後就會消滅,此時利用閉包就能把變數保存起來,並防止其他人存取
function makeclosure() {
var count = 0;
return {
plus1() {
return ++count;
},
minus1() {
return --count;
},
};
}
var countA = makeclosure();
console.log(countA.plus1()); //1
console.log(countA.plus1()); //2
console.log(countA.minus1()); //1
console.log(countA.plus1()); //2
首先在makeclosure
宣告了一個區域變數count
,並回傳一個有兩個方法的物件,
此時makeclosure
結束執行環境消滅,但count
變數被閉包保留著,count
只有呼叫兩種方法才能作修改,用其他方式都沒辦法修改count
。
因為閉包的存在可以讓函式有自己的變數,可以紀錄下之前運算過的結果,減少重複運算。
下面是利用閉包計算費式數列
function makeclosure() {
var Fibonacci = [1, 1];
return function (num) {
if (num > Fibonacci.length) {
for (let i = Fibonacci.length; i < num; i++) {
Fibonacci[i] = Fibonacci[i - 1] + Fibonacci[i - 2];
}
}
return Fibonacci[num - 1];
};
}
var func = makeclosure();
//func會回傳費式數列的第N個數
console.log(func(1)); //1
console.log(func(2)); //2
console.log(func(10)); //55
console.log(func(13));//233
這次在makeclosure
內建立了一個陣列紀錄算過的數字,當陣列內沒有數列結果時才會作運算,
會減少重複運算的時間(但多花了陣列的記憶體空間)